package com.wangyf.thread.c_004_volatile;

import java.util.concurrent.TimeUnit;

/**
 * 验证volatile的作用，此类只能验证 volatile的第一个特性：保证线程可见性，第二个特性见 TT
 * volatile: 易变的 告诉jvm这个变量容易改变
 * @author wangyf
 * @date 2021/1/1 23:23
 * 1. 保证线程可见性
 * 2. 禁止指令重排
 */
public class T {

    /*volatile*/ boolean running = true;

    void m1() {
        System.out.println("m1 start:"+running);
        while (running) {
            // 这里注释 sleep方法 才能看到效果 可能是sleep使得重新读取了running的值
            /*try {
                TimeUnit.MILLISECONDS.sleep(400);
                System.out.println("running");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }*/
        }
        System.out.println("m1 end");
    }

    public static void main(String[] args) {
        T t = new T();
        new Thread(t::m1).start();
        // 这里需要睡一下，不然直接给到running的状态就是false了，
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t.running = false;
        System.out.println("reset");
    }
}
